package com.ruoyi.log.service.impl;

import com.alibaba.fastjson2.JSON;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.ruoyi.common.enums.LogInfoType;
import com.ruoyi.log.mapper.WebLogMapper;
import com.ruoyi.log.service.ILogService;
import com.ruoyi.model.log.LogEntity;
import com.ruoyi.model.log.dto.QueryLog;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.stereotype.Service;

import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * 此类针对日志的操作
 */
@Service
@Slf4j
public class LogService extends ServiceImpl<WebLogMapper, LogEntity> implements ILogService {

    /**
     * 查询日志方法
     * @param queryLog 查询条件, 其中出去id之外都可以作为查询条件来操作
     * @return 经过筛选之后的日志信息
     */
    @Override
    public List<LogEntity> queryLogList(QueryLog queryLog) {
        // 通过Mybatis-Plus进行日志信息的查询

        // 生成条件筛选
        LambdaQueryWrapper<LogEntity> wrapper = Wrappers.<LogEntity>lambdaQuery();
        wrapper.eq(LogEntity::getLogType, queryLog.getLogType());
        Map<String, Object> params = queryLog.getParams();
        // 选择时间段进行查询
        if (params != null && !params.isEmpty()) {
            // 其选择时间参数不能为空
            Object val1 = params.get("beginCreateTime");
            Object val2 = params.get("endCreateTime");

            if (val1 != null && val2 != null) {
                wrapper.between(LogEntity::getCreateTime, val1, val2);
            }
        }
        // 如果查询是哪种操作
        if (StringUtils.isNotBlank(queryLog.getExecutionType())) {
            wrapper.eq(LogEntity::getExecutionType, queryLog.getExecutionType());
        }
        // 如果指定操作人则计入查询条件
        if (StringUtils.isNotBlank(queryLog.getExecutionPeople())) {
            wrapper.like(LogEntity::getExecutionPeople, queryLog.getExecutionPeople());
        }
        // 如果查询操作名称则计入查询
        if (StringUtils.isNotBlank(queryLog.getExecutionName())) {
            wrapper.like(LogEntity::getExecutionName, queryLog.getExecutionName());
        }
        // 如果查询条件ip不为空则计入查询条件
        if (StringUtils.isNotBlank(queryLog.getExecutionIp())) {
            wrapper.like(LogEntity::getExecutionIp, queryLog.getExecutionIp());
        }

        List<LogEntity> result = this.baseMapper.selectList(wrapper);

        // 将分类信息做好
        for (LogEntity logEntity : result) {
            logEntity.setExecutionType(LogInfoType.getDesc(logEntity.getExecutionType()));
        }

        return result;
    }


    @Override
    public int addLog(LogEntity logEntity) {
        return this.baseMapper.insert(logEntity);
    }
}
